package main

import "fmt"

type Speaker interface {
	Brawl()
	Say()
}
type Student struct {
	name string
	age  int32
}

/*
1.Student结构体必须实现Speaker定义的所有方法才算是实现了这个接口
2.接收者不一样，实现接口的主体也不一样
	1)如果接收者是结构体，那么需要接口的地方可以传入结构体对象，也可以传入结构体指针对象,但是传入的结构体指针对象是不能修改内部的对象的，也就是编译的时候自动把指针转为了值对象。
	2)如果接收者是结构体指针，那么只能传入结构体指针对象

*/
func (s Student) Say() {
	fmt.Print(s.name)
	s.name = "ddd"
}

func (s Student) Brawl() {
	fmt.Print(s.name)
	s.name = "bbb"
}

func Test(s Speaker) {
	s.Say()
}

func main() {
	s := &Student{
		name: "dsf",
		age:  10,
	}
	Test(*s)
	fmt.Print(s.name)
}
